package com.xwaf.platform.system.social.config;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

/**
 * 
 * <p>
 * 自定义线程池
 * <p>
 * 
 * @author 李聪 <br>
 * @email xwaf_love@yeah.net <br>
 * @since JDK 1.8<br>
 * @date 2019年12月30日 上午9:13:08 <br>
 * @see 无<br>
 *      Copyright (c) 2019, xwaf_love@yeah.net All Rights Reserved.<br>
 */
@Configuration
public class ThreadPoolConfig implements AsyncConfigurer {

	/**
	 * 定义线程池
	 */
	@Bean("myTaskExecutor")
	@Override
	public Executor getAsyncExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		// 核心线程池数量，方法: 返回可用处理器的Java虚拟机的数量。 -线程池创建时候初始化的线程数
		executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
		// 最大线程数量-线程池最大的线程数，只有在缓冲队列满了之后才会申请超过核心线程数的线程
		executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 5);
		// 线程池的队列容量-用来缓冲执行任务的队列
		executor.setQueueCapacity(Runtime.getRuntime().availableProcessors() * 2);
		// executor.setKeepAliveSeconds(60);
		// //默认60秒，允许线程的空闲时间60秒：当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
		// 线程名称的前缀-方便我们定位处理任务所在的线程池
		executor.setThreadNamePrefix("my-excutor-");
		// setRejectedExecutionHandler：当pool已经达到max size的时候，如何处理新任务
		// CallerRunsPolicy：不在新线程中执行任务，而是由调用者所在的线程来执行
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		// 所有任务执行完才关闭线程池
		executor.setWaitForTasksToCompleteOnShutdown(true);
		executor.initialize();
		return executor;
	}

	/**
	 * 异步任务中异常处理
	 */
	@Override
	public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
		return new SimpleAsyncUncaughtExceptionHandler();
	}
}
